﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Reflection;
using System.Text.RegularExpressions;
using DataAccessComponents;

namespace inzDesktop
{
    /// <summary>
    /// Interaction logic for FiltrowanieDataGrid.xaml
    /// </summary>
    public partial class FiltrowanieDataGrid : UserControl
    {
        private ICollectionView widok;
        private Predicate<object> filtr;

        public Predicate<object> Filtr
        {
            get { return filtr; }
            set { filtr = value; }
        }
        public ICollectionView Widok
        {
            get { return widok; }
            set { widok = value; }
        }
        public FiltrowanieDataGrid()
        {
            InitializeComponent();
        }

        private void btnZastosuj_Click(object sender, RoutedEventArgs e)
        {
            widok.Filter = this.filtr;
        }

        public bool mojFiltr<T>(object parameter)
        {
            T obiekt = (T)parameter;
            if (obiekt != null)
            {
                string zaznaczonyColumna = cbNazwaColumny.SelectedValue.ToString();

                //Pętla po właściwościach
                foreach (PropertyInfo property in typeof(T).GetProperties())
                {
                    if (zaznaczonyColumna.Equals(property.Name))
                    {
                        if (property.PropertyType.Equals(typeof(string)))
                        {
                            string tmp = (string)property.GetValue(obiekt, null);
                            if (tmp.Contains(tbTextFiltrowany.Text))
                            {
                                return true;
                            }
                            else
                                return false;
                        }
                    }
                }
                return true;
            }

            return true;
        }

        public bool filtrListaKlientow(object parameter)
        {
            Klient objekt = parameter as Klient;
            string zaznaczonaColumna = cbNazwaColumny.SelectedValue.ToString();
            string tekst = tbTextFiltrowany.Text;

            if (string.IsNullOrEmpty(tekst))
                return true;

            if (objekt != null && !string.IsNullOrEmpty(zaznaczonaColumna))
            {
                if (zaznaczonaColumna.Equals("ID") && Regex.IsMatch(tekst, @"[0-9]+"))
                {
                    if (objekt.Id_klient == Int32.Parse(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Imie"))
                {
                    if (objekt.Imie.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Nazwisko"))
                {
                    if (objekt.Nazwisko.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Nr stacjonarny"))
                {
                    if (objekt.Tel_stacjonarny.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Nr komórkowy"))
                {
                    if (objekt.Tel_komorkowy.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Email"))
                {
                    if (objekt.Email.Contains(tekst))
                    {
                        return true;
                    }
                }
            }
            return false;
        }

        public bool filtrListaPracownikow(object parameter)
        {
            Pracownik objekt = parameter as Pracownik;
            string zaznaczonaColumna = cbNazwaColumny.SelectedValue.ToString();
            string tekst = tbTextFiltrowany.Text;

            if (string.IsNullOrEmpty(tekst))
                return true;

            if (objekt != null && !string.IsNullOrEmpty(zaznaczonaColumna))
            {
                if (zaznaczonaColumna.Equals("ID") && Regex.IsMatch(tekst, @"[0-9]+"))
                {
                    if (objekt.Id_pracownik == Int32.Parse(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Imie"))
                {
                    if (objekt.Imie.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Nazwisko"))
                {
                    if (objekt.Nazwisko.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Email"))
                {
                    if (objekt.Email.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Oddział"))
                {
                    if (objekt.Oddzial.Nazwa.Contains(tekst))
                    {
                        return true;
                    }
                }
            }           
            return false;
        }

        public bool filtrListaOfert(object parameter)
        {
            Oferta objekt = parameter as Oferta;
            string zaznaczonaColumna = cbNazwaColumny.SelectedValue.ToString();
            string tekst = tbTextFiltrowany.Text;

            if (string.IsNullOrEmpty(tekst))
                return true;

            if (objekt != null && !string.IsNullOrEmpty(zaznaczonaColumna))
            {
                if (zaznaczonaColumna.Equals("ID") && Regex.IsMatch(tekst, @"[0-9]+"))
                {
                    if (objekt.Id_oferta == Int32.Parse(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Skrót"))
                {
                    if (objekt.Skrot.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Nazwa"))
                {
                    if (objekt.Nazwa.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Kategoria"))
                {
                    if (objekt.Kategoria.Nazwa.Contains(tekst))
                    {
                        return true;
                    }
                }else if (zaznaczonaColumna.Equals("Ilość terminów") && Regex.IsMatch(tekst, @"[0-9]+"))
                {
                    if (objekt.Ilosc_terminow == Int32.Parse(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Typ pokoju") && Regex.IsMatch(tekst, @"[0-9]+"))
                {
                    if (objekt.Typ_pokoju.Contains(tekst))
                    {
                        return true;
                    }
                }
            }           
            return false;
        }

        public bool filtrListaHoteli(object parameter)
        {
            Hotel objekt = parameter as Hotel;
            string zaznaczonaColumna = cbNazwaColumny.SelectedValue.ToString();
            string tekst = tbTextFiltrowany.Text;

            if (string.IsNullOrEmpty(tekst))
                return true;

            if (objekt != null && !string.IsNullOrEmpty(zaznaczonaColumna))
            {
                if (zaznaczonaColumna.Equals("Nazwa"))
                {
                    if (objekt.Nazwa.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Standard hotelu"))
                {
                    if (objekt.Standard.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Miasto"))
                {
                    if (objekt.Miasto.Nazwa.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Kraj"))
                {
                    if (objekt.Miasto.Kraj.Nazwa.Contains(tekst))
                    {
                        return true;
                    }
                }               
            }
            return false;
        }

        public bool filtrListaTerminow(object parameter)
        {
            Termin objekt = parameter as Termin;
            string zaznaczonaColumna = cbNazwaColumny.SelectedValue.ToString();
            string tekst = tbTextFiltrowany.Text;

            if (string.IsNullOrEmpty(tekst))
                return true;

            if (objekt != null && !string.IsNullOrEmpty(zaznaczonaColumna))
            {
                if (zaznaczonaColumna.Equals("ID") && Regex.IsMatch(tekst, @"[0-9]+"))
                {
                    if (objekt.Id_termin == Int32.Parse(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Oferta"))
                {
                    if (objekt.Oferta.Nazwa.Contains(tekst))
                    {
                        return true;
                    }
                }                
                else if (zaznaczonaColumna.Equals("Ilość dni") && Regex.IsMatch(tekst, @"[0-9]+"))
                {
                    if (objekt.Ilosc_dni == Int32.Parse(tekst))
                    {
                        return true;
                    }
                }
            }
            return false;
        }

        public bool filtrListaRezerwacji(object parameter)
        {
            Rezerwacja objekt = parameter as Rezerwacja;
            string zaznaczonaColumna = cbNazwaColumny.SelectedValue.ToString();
            string tekst = tbTextFiltrowany.Text;

            if (string.IsNullOrEmpty(tekst))
                return true;

            if (objekt != null && !string.IsNullOrEmpty(zaznaczonaColumna))
            {
                if (zaznaczonaColumna.Equals("ID") && Regex.IsMatch(tekst, @"[0-9]+"))
                {
                    if (objekt.Id_rezerwacja == Int32.Parse(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Imie"))
                {
                    if (objekt.Klient.Imie.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Nazwisko"))
                {
                    if (objekt.Klient.Nazwisko.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Telefon"))
                {
                    if (objekt.Klient.Tel_komorkowy.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Status"))
                {
                    if (objekt.Status.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Oddział"))
                {
                    if (objekt.Oddzial.Nazwa.Contains(tekst))
                    {
                        return true;
                    }
                }
                
            }
            return false;
        }

        public bool filtrListaKlientUslugi(object parameter)
        {
            KlientUslugi objekt = parameter as KlientUslugi;
            string zaznaczonaColumna = cbNazwaColumny.SelectedValue.ToString();
            string tekst = tbTextFiltrowany.Text;

            if (string.IsNullOrEmpty(tekst))
                return true;

            if (objekt != null && !string.IsNullOrEmpty(zaznaczonaColumna))
            {
                if (zaznaczonaColumna.Equals("ID") && Regex.IsMatch(tekst, @"[0-9]+"))
                {
                    if (objekt.Id_rezerwacja == Int32.Parse(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Oferta"))
                {
                    if (objekt.Oferta.Nazwa.Contains(tekst))
                    {
                        return true;
                    }
                }
                else if (zaznaczonaColumna.Equals("Kategoria"))
                {
                    if (objekt.Oferta.Kategoria.Nazwa.Contains(tekst))
                    {
                        return true;
                    }
                }                

            }
            return false;
        }
        private void btnCzysc_Click(object sender, RoutedEventArgs e)
        {
            tbTextFiltrowany.Clear();
            widok.Refresh();
        }


        
    }
}
